package com.cn.icss.config;

import com.cn.icss.interceptor.ExceptionHandlerInterceptor;
import com.cn.icss.plugins.MyFstSerializer;
import com.cn.icss.router.*;
import com.cn.icss.service.IDictionaryTypeService;
import com.cn.icss.service.impl.DictionaryTypeServiceImpl;
import com.cn.icss.vo._MappingKit;
import com.jfinal.aop.Aop;
import com.jfinal.config.*;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.ehcache.CacheKit;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.plugin.ehcache.IDataLoader;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import live.autu.plugin.jfinal.swagger.config.SwaggerPlugin;
import live.autu.plugin.jfinal.swagger.config.routes.SwaggerRoutes;
import live.autu.plugin.jfinal.swagger.model.SwaggerApiInfo;
import live.autu.plugin.jfinal.swagger.model.SwaggerDoc;

/**
*@中软华腾软件系统有限公司,未经授权不得擅自传播
*@方法描述:
*@方法参数描述:
** @param
*@作者: 蒋正午
*@编辑时间: 2020/04/16  15:06
*@返回值描述:
*/ 
public class JFinalLiveConfig extends JFinalConfig {

    public static void main(String[] args) {
        // 不写明 就是读取undertow.txt这个名字的配置启动
        UndertowServer.start(JFinalLiveConfig.class);
    }

    static Prop p;

    static void loadConfig() {
        if (p == null) {
            // 后面
            p = PropKit.useFirstFound("db.txt");
        }
    }

    @Override
    public void configConstant(Constants me) {
        loadConfig();
        me.setDevMode(true);
        // 配置 encoding，默认为 UTF8
        me.setEncoding("UTF8");
        // 配置 json 转换 Date 类型时使用的 data parttern
        me.setJsonDatePattern("yyyy-MM-dd HH:mm");
        // 配置上传文件最大数据量，默认 10M
        me.setMaxPostSize(10 * 1024 * 1024);
        /**
         * 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层，并且自动实现 AOP
         * 注入动作支持任意深度并自动处理循环注入
         */
        me.setInjectDependency(true);
        // 配置对超类中的属性进行注入
        me.setInjectSuperClass(true);
        // 使用enjoy模板
        me.setViewType(ViewType.JFINAL_TEMPLATE);

    }


    @Override
    public void configRoute(Routes me) {
        me.add(new SwaggerRoutes()); // 配置好Swagger路由
        me.add(new LiveResourceRouter());
        me.add(new LiveStreamRouter());
        me.add(new LiveCallBackRouter());
        // 增加点赞
        me.add(new ThumbUpRouter());
        me.add(new CommentRouter());
        me.add(new RewardRouter());

    }

    @Override
    public void configEngine(Engine me) {
        me.setDevMode(true); // 支持引擎enjoy模板热部署
        me.setEncoding("UTF-8");

    }

    @Override
    public void configPlugin(Plugins me) {
        // 配置 druid 数据库连接池插件
        DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
        me.add(druidPlugin);
        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
        // 设置数据库方言
        arp.setDialect(new MysqlDialect());
        // 所有映射在 MappingKit 中自动化搞定
        _MappingKit.mapping(arp);
        me.add(arp);
        // 配置Swagger插件支持 注意要配置好对应的ip,如果是本机测试注意是用127.0.0.1还是页面上用localhost
        // setHost("192.168.117.20").
        me.add(new SwaggerPlugin(new SwaggerDoc().setBasePath("/").setSwagger("2.0")
                .setInfo(new SwaggerApiInfo("中软华腾直播微服务 Api", "1.0", "中软华腾直播微服务 Api", ""))));
        // 增加ehcache插件支持
        me.add(new EhCachePlugin(this.getClass().getClassLoader().getResource("ehcache.xml")));
        // 增加Redis插件的支持
        // 用于缓存bbs模块的redis服务
        Prop prop_redis = PropKit.use("redisconf.txt");
        String REDISHOST=prop_redis.get("redis.ip");
        String REDISPASSWORD=prop_redis.get("redis.password");
        int REDISPORT=Integer.parseInt(prop_redis.get("redis.port"));
        RedisPlugin liveRedis = new RedisPlugin("liveStream", REDISHOST,REDISPORT,REDISPASSWORD);
        // 增加序列化插件
        liveRedis.setSerializer(new MyFstSerializer());
        me.add(liveRedis);

    }

    // 这个是给自动生成vo代码类用的
    public static DruidPlugin createDruidPlugin() {
        loadConfig();
        return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
    }
    // 可以在前端获取session值
    @Override
    public void configInterceptor(Interceptors me) {
        // 这里是配置全局拦截器
        me.add(new SessionInViewInterceptor(true));
        me.add(new ExceptionHandlerInterceptor());
    }

    @Override
    public void configHandler(Handlers me) {

    }

    // 启动之后建立好缓存
    @Override
    public void onStart() {

        IDictionaryTypeService dictionaryTypeService = Aop.get(DictionaryTypeServiceImpl.class);
        CacheKit.get("dictionary_type_cache", "dictionaryTypes", new IDataLoader() {
            @Override
            public Object load() {
                return dictionaryTypeService.findAll();
            }
        });

    }
}
